package persistencia.busqueda;

import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import negocio.busqueda.ExperienciaTarea;
import negocio.busqueda.Perfil;
import negocio.cv.Tarea;
import persistencia.DACBase;
import persistencia.DACNivel;
import persistencia.SingletonDACBase;
import persistencia.cliente.DACTarea;

public class DACExperienciaTarea extends DACBase {
	
	private List<ExperienciaTarea> experienciasEnTarea;
	private ExperienciaTarea experiencia;
	private CallableStatement clstm;
	private ResultSet rs;
	
	
	public DACExperienciaTarea(DACBase dacBase) {
		super(dacBase);
		// TODO Auto-generated constructor stub
	}

	public void actualizarExperinciaEnTareas(Perfil perfil) {
		try {
			
			List<ExperienciaTarea> etAModificar = consultarExperienciaDePerfil(perfil.getIdPerfil());
			
			for (ExperienciaTarea experiencia  : perfil.getExperienciasEnTareas()) {
				
				clstm = getConn().prepareCall("{call save_experienciatarea(?,?,?,?)}");
				
				clstm.setInt("idperfil", perfil.getIdPerfil());
				clstm.setInt("idtarea", experiencia.getTarea().getIdTarea());
				clstm.setInt("idnivel", experiencia.getTarea().getNivelDeExperiencia().getIdNivel());				
				if (experiencia.isExcluyente()) {
					clstm.setString("excluyente", "S" );
				}
				else {
					clstm.setString("excluyente", "N" );
				}
				
				clstm.execute();	
				
			
				
				if (etAModificar.indexOf(experiencia) != -1) {
					etAModificar.remove(experiencia);
				}
			}
			
			for (ExperienciaTarea experiencia  : etAModificar){
				eliminarExperienciaEnTarea(experiencia, perfil.getIdPerfil());
			}
			
			
		
			if(clstm != null)
				clstm.close();
	        clstm = null;
	            	            
	        
		}
		
		catch (SQLException ex) {
		    // handle any errors			
		    System.out.println("SQLException: " + ex.getMessage());
		    System.out.println("SQLState: " + ex.getSQLState());
		    System.out.println("VendorError: " + ex.getErrorCode());
		    System.out.println("Error en metodo altaExperinciaEnTareas_DacExperinciaEnTareas");
		}		
	}
	
	public void eliminarExperienciaEnTarea(ExperienciaTarea et, int idPerfil ) {
		try {	
			
			clstm = getConn().prepareCall("{call delete_experienciatarea(?,?)}");				
			clstm.setInt("par_idperfil", idPerfil);
			clstm.setInt("par_idtarea", et.getTarea().getIdTarea());
			clstm.execute();	
				
			if(clstm != null)
				clstm.close();
	        clstm = null;
	         
	                    
	        
		}
		
		catch (SQLException ex) {
		    // handle any errors			
		    System.out.println("SQLException: " + ex.getMessage());
		    System.out.println("SQLState: " + ex.getSQLState());
		    System.out.println("VendorError: " + ex.getErrorCode());
		    System.out.println("Error en metodo eliminarExperinciaEnTareas_DacExperinciaEnTareas");
		}	
	}
	
	public List<ExperienciaTarea> consultarExperienciaDePerfil (int idPerfil){
		try{
			experienciasEnTarea = new ArrayList<ExperienciaTarea>();
			clstm = getConn().prepareCall("{call experienciatareaConsultar(?)}");
			clstm.setInt("idperfil", idPerfil);			
			clstm.execute();
			rs = clstm.getResultSet();			
			while (rs.next()) {
				experiencia = new ExperienciaTarea();				
				Tarea t = new Tarea();
				
				DACTarea dacT = new DACTarea(SingletonDACBase.tomarDACBase());
				t = dacT.consultarTarea(rs.getInt("idtarea"));
				
				DACNivel n = new DACNivel(SingletonDACBase.tomarDACBase());				
				t.setNivelDeExperiencia(n.consultarNivel(rs.getInt("idnivel")));				
				
				experiencia.setTarea(t);
				
				if(rs.getString("excluyente").equals("S")) {				 
					 experiencia.setExcluyente(true);
				 }
				 else {
					 experiencia.setExcluyente(false);
				 } 
				
				
				experienciasEnTarea.add(experiencia);				 
			}			           
	
			rs.close();
			rs = null;
			clstm.close();
	        clstm = null;
	        
	      
	        
		}   
		catch (SQLException ex) {
		    // handle any errors
		    System.out.println("SQLException: " + ex.getMessage());
		    System.out.println("SQLState: " + ex.getSQLState());
		    System.out.println("VendorError: " + ex.getErrorCode());
		    System.out.println("Error en metodo consultarPerfil()_DacPerfil");
		}
		
	    return experienciasEnTarea;		
		
	}
	
	

}
